Type System
Type System
프로그래밍 언어가 프로그램에서 가질 수 있는 타입을 이해하는 방법에 대한 규칙 집합
언어의 타입 관련된 문법 체계
- 규칙
- 값들을 어떤 기준으로 묶어서 타입을 규정할 것인가?
- 코드의 타입을 언제 검사할 것인가?
- 어떻게 타입을 검사할 것인가?
기본적인 타입 시스템의 작동
- 코드를 읽고 존재하는 모든 타입과 값을 이해한다.
- 각 값이 초기 선언에서 가질 수 있는 타입을 확인한다.
- 각 값이 추후 코드에서 어떻게 사용될 수 있는지 모든 방법을 확인한다.
- 값의 사용법이 타입과 일치하지 않으면 사용자에게 오류를 표시한다.
타입스크립트는 다음과 같은 순서로 오류를 표시한다.
let firstName = 'Whitney';
firstName.length();
- 코드를 firstName이라는 변수를 이해한다.
- 초깃값이 "Whitney" 이므로 firstName이 string 타입이라고 결론짓는다.
- firstName의 .length 멤버를 함수처럼 호출하는 코드를 확인합니다.
- string의 .length 멤버는 함수가 아닌 숫자라는 오류를 표시한다.
타입시스템의 두 가지 종류
어떤 타입을 사용하는지를 컴파일러에 명시적으로 알려주는 타입 시스템
- 정적 타입 시스템
- 코드 실행 이전에 모든 변수의 타입을 고정적으로 결정
- 엄격하고 고정적인 시스템 (C, Java)
- 이노테이션을 이용하면 타입스크립트에 명시적으로 타입을 지정할 수 있다.
- 단점으로 모든 변수에 일일이 타입을 지정해주어야 하기 때문에 코드의 양이 많아지며 유연하지 못하다.
let a: number = 1; // number
let b: string = 'hello'; // string
let c: boolean[] = [true, false]; // boolean 배열- 정적 타입 시스템
자동으로 타입을 추론하는 타입 시스템
- 동적 타입 시스템
- 코드를 실행하고 나서 유동적으로 변수의 타입을 결정
- 자유롭고 유연한 시스템 (Python, javaScript)
- 이노테이션을 사용하지 않으면 타입스크립트가 알아서 타입을 추론한다.
- 단점으로 코드의 타입 오류를 미리 검사할 수 없으며 예기치 못한 오류가 발생할 수 있다.
- 동적 타입 시스템
타입스크립트는 점진적 타입 시스템이다.
- 동적인 타입 시스템의 안전하지 않은 문제를 해결하면서도 정적인 타입 시스템의 귀찮음도 동시에 해결한다.
- 실행 전 검사를 통한 타입 안정성 확보
- 자동으로 변수의 타입을 추론함
let a = 1; // number
let b = 'hello'; // string
let c = [true, false]; // boolean 배열
타입스크립트 vs 자바스크립트
| 타입 시스템 기능 | 자바스크립트 | 타입스크립트 |
|---|---|---|
| 타입 결정 방식 | 동적 | 정적 |
| 타입이 자동으로 변환되는가? | O | X(대부분) |
| 언제 타입을 확인하는가? | 런타임 | 컴파일 |
| 언제 에러를 검출하는가? | 런타임(대부분) | 컴파일(대부분) |
오류 종류
타입스크립트를 작성하는 동안 가주 접하게 되는 오류 두 가지는 다음과 같다.
- 구문 오류: 타입스크립트가 자바스크립트로 변환되는 것을 차단한 경우
- 타입 스크립트가 코드로 이해할 수 없는 잘못된 구문을 감지할 때 발생한다.
- 타입스크립트가 자바스크립트 파일을 올바르게 생성할 수 없도록 차단한다.
- 타입 오류: 타입 검사기에 따라 일치하지 않는 것이 감지된 경우
- 타입스크립트의 타입 검사기가 프로그램의 타입에서 오류를 감지했을 때 발생한다.
할당 가능성
- 변수의 초기값을 읽고 해당 변수가 허용되는 타입을 결정한다.
- 변수에 새롭게 할당되는 값이 원래 벼눗의 타입과 동일한지 확인한다.
let firstName = 'Cho';
firstName = 'Ahn';
- 초기 타입이 string이라 새로운 문자열이 할당이 되어도 문제가 생기지 않는다.
let lastName = 'Byeong Min';
lastName = 10; // 오류 발생
- 초기 타입이 string이라 새로운 타입이 할당되면 오류가 발생한다.